using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Furion.FriendlyException;
using NewLife.Caching;
using TencentCloud.Common;
using TencentCloud.Common.Profile;
using TencentCloud.Sms.V20210111;
using TencentCloud.Sms.V20210111.Models;

namespace Admin.NET.Application.Service.Sms;

/// <summary>
/// 发送短信工具集
/// </summary>
public static class SmsTool
{
	/// <summary>
	/// 发送短信验证码
	/// </summary>
	/// <param name="cache">缓存</param>
	/// <param name="phoneNumber">
	/// 下发手机号码，采用 E.164 标准，+[国家或地区码][手机号]
	/// 示例如：+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号，最多不要超过200个手机号
	/// </param>
	/// <param name="signName">
	/// 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名 */
	/// 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看
	/// </param>
	/// <param name="templateId">
	/// 模板 ID: 必须填写已审核通过的模板 ID */
	/// 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看
	/// </param>
	/// <param name="SecretId">腾讯云账户密钥对secretId，secretKey</param>
	/// <param name="SecretKey">腾讯云账户密钥对secretId，secretKey</param>
	/// <param name="SmsSdkAppId">
	///  基本类型的设置:
	/// SDK采用的是指针风格指定参数，即使对于基本类型你也需要用指针来对参数赋值。
	/// SDK提供对基本类型的指针引用封装函数
	/// 帮助链接：
	/// 短信控制台: https://console.cloud.tencent.com/smsv2
	/// 腾讯云短信小助手: https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81 */
	/// 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId，示例如1400006666 */
	/// 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看
	/// </param>
	/// <param name="TemplateParamSet">
	/// 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致，若无模板参数，则设置为空
	/// </param>
	/// <returns>短信回包</returns>
	public static async Task<(SendSmsResponse, List<string>)> SendCAPTCHA(ICache cache, string phoneNumber, string signName, string templateId, string SecretId, string SecretKey, string SmsSdkAppId)
	{
		string key = "CAPTCHA:" + phoneNumber;
		string key30 = "CAPTCHA:" + phoneNumber + ":30";
		if (cache.ContainsKey(key30))
		{
			throw Oops.Bah("请勿重复发送验证码");
		}
		Random rd = new Random();
		string captcha = rd.Next(100000, 999999).ToString();
		if (!phoneNumber.StartsWith("+86"))
		{
			phoneNumber = "+86" + phoneNumber;
		}
		string[] phoneNumbers = new string[1] { phoneNumber };
		cache.Set(key, captcha, 300);
		cache.Set(key30, captcha, 30);
		return (await SendSms(phoneNumbers, signName, templateId, SecretId, SecretKey, SmsSdkAppId, captcha, "5"), new List<string> { captcha, "5" });
	}

	/// <summary>
	/// 发送催缴短信
	/// </summary>
	/// <param name="roomName">房间名称</param>
	/// <param name="balanceLimit">方案限额，例如方案预警余额20，低于20时预警，此时传20</param>
	/// <param name="phoneNumber">
	/// 下发手机号码，采用 E.164 标准，+[国家或地区码][手机号]
	/// 示例如：+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号，最多不要超过200个手机号
	/// </param>
	/// <param name="signName">
	/// 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名 */
	/// 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看
	/// </param>
	/// <param name="templateId">
	/// 模板 ID: 必须填写已审核通过的模板 ID */
	/// 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看
	/// </param>
	/// <param name="SecretId">腾讯云账户密钥对secretId，secretKey</param>
	/// <param name="SecretKey">腾讯云账户密钥对secretId，secretKey</param>
	/// <param name="SmsSdkAppId">
	///  基本类型的设置:
	/// SDK采用的是指针风格指定参数，即使对于基本类型你也需要用指针来对参数赋值。
	/// SDK提供对基本类型的指针引用封装函数
	/// 帮助链接：
	/// 短信控制台: https://console.cloud.tencent.com/smsv2
	/// 腾讯云短信小助手: https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81 */
	/// 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId，示例如1400006666 */
	/// 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看
	/// </param>
	/// <param name="TemplateParamSet">
	/// 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致，若无模板参数，则设置为空
	/// </param>
	/// <returns>短信回包</returns>
	public static async Task<(SendSmsResponse, List<string>)> SendBalnceCall(string roomName, string balanceLimit, string phoneNumber, string signName, string templateId, string SecretId, string SecretKey, string SmsSdkAppId)
	{
		if (!phoneNumber.StartsWith("+86"))
		{
			phoneNumber = "+86" + phoneNumber;
		}
		string[] phoneNumbers = new string[1] { phoneNumber };
		return (await SendSms(phoneNumbers, signName, templateId, SecretId, SecretKey, SmsSdkAppId, roomName, balanceLimit), new List<string> { roomName, balanceLimit });
	}

	/// <summary>
	/// 发送自定账单催缴短信
	/// </summary>
	/// <param name="enddate">截止日期</param>
	/// <param name="phoneNumbers">手机号列表+86</param>
	/// <param name="signName"></param>
	/// <param name="templateId"></param>
	/// <param name="SecretId"></param>
	/// <param name="SecretKey"></param>
	/// <param name="SmsSdkAppId"></param>
	/// <returns></returns>
	public static async Task<(SendSmsResponse, List<string>)> SendBillCall(string enddate, string[] phoneNumbers, string signName, string templateId, string SecretId, string SecretKey, string SmsSdkAppId)
	{
		return (await SendSms(phoneNumbers, signName, templateId, SecretId, SecretKey, SmsSdkAppId, enddate), new List<string> { enddate });
	}

	/// <summary>
	/// 发送短信
	/// </summary>
	/// <param name="PhoneNumberSet">
	/// 下发手机号码，采用 E.164 标准，+[国家或地区码][手机号]
	/// 示例如：+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号，最多不要超过200个手机号
	/// </param>
	/// <param name="signName">
	/// 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名 */
	/// 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看
	/// </param>
	/// <param name="templateId">
	/// 模板 ID: 必须填写已审核通过的模板 ID */
	/// 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看
	/// </param>
	/// <param name="SecretId">腾讯云账户密钥对secretId，secretKey</param>
	/// <param name="SecretKey">腾讯云账户密钥对secretId，secretKey</param>
	/// <param name="SmsSdkAppId">
	///  基本类型的设置:
	/// SDK采用的是指针风格指定参数，即使对于基本类型你也需要用指针来对参数赋值。
	/// SDK提供对基本类型的指针引用封装函数
	/// 帮助链接：
	/// 短信控制台: https://console.cloud.tencent.com/smsv2
	/// 腾讯云短信小助手: https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81 */
	/// 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId，示例如1400006666 */
	/// 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看
	/// </param>
	/// <param name="TemplateParamSet">
	/// 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致，若无模板参数，则设置为空
	/// </param>
	/// <returns>短信回包</returns>
	public static async Task<SendSmsResponse> SendSms(string[] PhoneNumberSet, string signName, string templateId, string SecretId, string SecretKey, string SmsSdkAppId, params string[] TemplateParamSet)
	{
		try
		{
			Credential cred = new Credential
			{
				SecretId = SecretId,
				SecretKey = SecretKey
			};
			SmsClient client = new SmsClient(cred, "ap-guangzhou", new ClientProfile
			{
				SignMethod = ClientProfile.SIGN_TC3SHA256,
				HttpProfile = new HttpProfile
				{
					ReqMethod = "GET",
					Timeout = 10,
					Endpoint = "sms.tencentcloudapi.com"
				}
			});
			return client.SendSmsSync(new SendSmsRequest
			{
				SmsSdkAppId = SmsSdkAppId,
				SignName = signName,
				TemplateId = templateId,
				TemplateParamSet = TemplateParamSet,
				PhoneNumberSet = PhoneNumberSet,
				SessionContext = "",
				ExtendCode = "",
				SenderId = ""
			});
		}
		catch (Exception ex)
		{
			Exception e = ex;
			Console.WriteLine("发送短信异常：" + e.Message + "\r\n" + e.StackTrace);
			return null;
		}
	}
}
